package code19_jdk8.stream;

import java.util.ArrayList;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import code19_jdk8.stream.Emp.State;

public class TestTerminate04 {

	public static void main(String[] args) {
		//t1();
		
		//t2();
		
		//t3();
		
		//t4();
		
		//t5();
		
		t6();
	}

	private static void t6() {
		// 连接
		// 把所有员工的姓名拼接在一起
		String str = Emp.getData().stream()
		.map(Emp::getName) // 提取姓名
		//.collect(Collectors.joining()) // 直接连接
		//.collect(Collectors.joining(",")) // 使用 指定内容 连接
		.collect(Collectors.joining(",", "=", "=")) // 使用 指定内容 连接元素, 并在连接后的结果前和后 再拼接上 指定内容
		;
		System.out.println(str);
	}

	private static void t5() {
		// 集合统计
		// summarizingDouble 统计 double 类型
		// summarizingInt 统计 int 类型
		// summarizingLong 统计 long 类型
		
		DoubleSummaryStatistics statistics = Emp.getData().stream()
		.collect(Collectors.summarizingDouble( Emp::getSal ));
		
		System.out.println("总数量:"+statistics.getCount());
		System.out.println("总和:"+statistics.getSum());
		System.out.println("平均值:"+statistics.getAverage());
		System.out.println("最大值:"+statistics.getMax());
		System.out.println("最小值:"+statistics.getMin());
	}

	private static void t4() {
		// 分区
		Map<Boolean, List<Emp>> map = Emp.getData().stream()
		// >30 的一个区 (true), <=30 的一个区 (false)
		.collect(Collectors.partitioningBy( e -> e.getAge() > 30));
		Set<Boolean> keySet = map.keySet();
		for (Boolean b : keySet) {
			System.out.println("组别:" + b);
			List<Emp> list = map.get(b);
			list.forEach(e -> System.out.println("\t"+e));
		}
	}

	private static void t3() {
		// 分组
		Map<State, List<Emp>> map = Emp.getData().stream()
		// Function<? super T, ? extends K> classifier 的方法的返回是分组依据
		// 根据员工状态分组
		.collect(Collectors.groupingBy( e -> e.getState() ));
		Set<State> keySet = map.keySet();
		for (State state : keySet) {
			System.out.println("组别:" + state);
			List<Emp> list = map.get(state);
			list.forEach(e -> System.out.println("\t"+e));
		}
	}

	private static void t2() {
		// 基本统计
		// counting 元素数量统计
		Long counting = Emp.getData().stream()
		.collect(Collectors.counting());
		System.out.println("数量:" + counting);
		
		// averagingXXX 统计元素中某个属性的平均值
		Double averagingDouble = Emp.getData().stream()
		// 统计工资的平均值
		.collect(Collectors.averagingDouble( Emp::getSal ));
		System.out.println("averagingDouble:" + averagingDouble);
		
		// summingXXX 统计元素中某个属性的总和
		Double summingDouble = Emp.getData().stream()
		// 统计总工资
		.collect(Collectors.summingDouble( Emp::getSal ));
		System.out.println("summingDouble:" + summingDouble);
		
		Optional<Emp> maxBy = Emp.getData().stream()
		// 统计最大工资
		.collect(Collectors.maxBy( 
				// 一般使用 参数1 - 参数2 得到正常的 最大结果
				//(e1,e2)-> Double.compare(e1.getSal(), e2.getSal()) 
				TestTerminate04::compare
				));
		System.out.println("maxBy:" + maxBy);
		
		Optional<Emp> minBy = Emp.getData().stream()
		// 统计最小工资
		.collect(Collectors.minBy( 
				// 一般使用 参数1 - 参数2 得到正常的 最小结果
				(e1,e2)-> Double.compare(e1.getSal(), e2.getSal()) 
				));
		System.out.println("minBy:" + minBy);
	}
	
	public static int compare(Emp e1, Emp e2) {
		return Double.compare(e1.getSal(), e2.getSal());
	}

	private static void t1() {
		// 收集所有员工的姓名
		ArrayList<String> collect = Emp.getData().stream()
		.map(Emp::getName)
		// toList, toSet 等把元素存入指定类型的集合中
		//.collect(Collectors.toList());
		// toCollection 使用自己创建的集合 存储元素
		.collect(Collectors.toCollection( ArrayList::new ));
		System.out.println("names:" + collect);
	}
	
}
